`
https://leetcode.cn/problems/minimum-number-of-flips-to-make-the-binary-string-alternating/
`

/**
 * @param {string} s
 * @return {number}
 */
var minFlips = function (s) {
  // 类型 1 可以无限操作，实际上等价于 s + s 的每个长度为 n 的字串，可以使用滑动窗口来模拟
  // 最终要将字符串变成 '1010...' 或 '0101...' ，可以随意选一种，通过下标奇偶判断当前位置是否要改变
  // 得到结果 cnt ，则另一种的操作数便是 len - cnt
  // 思路：https://leetcode.cn/problems/minimum-number-of-flips-to-make-the-binary-string-alternating/solutions/815298/cong-qian-wang-hou-pi-pei-cong-hou-wang-uiq6a/

  const n = s.length
  let res = Infinity
  let cnt = 0
  let left = 0, right = 0

  // 维护一个长度为 n 的滑动窗口，遍历 (s + s)[:-2]
  while (right < n * 2 - 1) {
    const x = s[right < n ? right : right % n]
    if (x == right % 2) {
      cnt++
    }
    right++

    if (right - left >= n) {
      // 更新答案
      res = Math.min(res, cnt, n - cnt)

      const y = s[left < n ? left : left % n]
      if (y == left % 2) {
        cnt--
      }
      left++
    }
  }

  return res
};